package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"os"

	"github.com/rivo/tview"
)

type Company struct {
	Title string `json:"title"`
	AppID string `json:"appid"` // 注意JSON中的键是大小写敏感的，所以这里应该是"appid"而不是"AppID"或"Appid"
}

// 创建一个空的切片来存放解析后的结果
var jsonArr []Company

func getList() []Company {
	// 文件名
	// 文件名
	filename := "list.txt"

	// 打开文件
	content, err := ioutil.ReadFile(filename)
	if err != nil {
		log.Fatalf("Error reading file %s: %v", filename, err)
	}

	strContent := string(content)
	// fmt.Printf("%s\n", strContent)
	errs := json.Unmarshal([]byte(strContent), &jsonArr)
	if errs != nil {
		log.Fatalf("Error parsing JSON: %v", errs)
	}
	/* fmt.Printf("%v\n", jsonArr)
	fmt.Printf("%v\n", jsonArr[0].Title) */
	return jsonArr
}

type Config struct {
	TextViewShow int
	FormShow     int
	App          *tview.Application
	ContentFlex  *tview.Flex
}

var cfg Config

type Details struct {
	title string
	appid string
}

var det Details

func main() {
	app := tview.NewApplication()
	cfg.App = app
	fmt.Printf("%T", app)

	/* edit := tview.NewButton("edit").
		SetSelectedFunc(func() {
			fmt.Println("Button clicked!")
		})
	del := tview.NewButton("del").
		SetSelectedFunc(func() {
			fmt.Println("Button clicked!")
		}) */
	// 将文本框和按钮放入一个灵活的布局中
	/* headerFlex := tview.NewFlex().SetDirection(tview.FlexColumn).
	AddItem(edit, 10, 50, false).
	AddItem(del, 10, 50, false) */

	newPrimitive := func(text string) tview.Primitive {
		return tview.NewTextView().
			SetTextAlign(tview.AlignCenter).
			SetText(text)
	}

	textView := tview.NewTextView().SetText("欢迎使用微信版本管理工具")

	welcomeFlex := tview.NewFlex().SetDirection(tview.FlexRow).AddItem(textView, 0, 1, false)
	form := tview.NewForm().
		AddTextView("name:", det.title, 40, 2, true, false).
		AddTextView("appid:", det.appid, 40, 2, true, false)
	// form.SetBorder(true).SetTitle("详情信息").SetTitleAlign(tview.AlignLeft)
	submitUi := cfg.SubmitMakeUI()
	tabs := tview.NewForm().
		AddButton("版本管理", func() {
			app.Stop()
		}).
		AddButton("提交代码", func() {
			cfg.ContentFlex.ResizeItem(submitUi, 0, 1)

		})
	tabsFlex := tview.NewFlex().SetDirection(tview.FlexColumn).AddItem(tabs, 0, 1, false)
	cfg.FormShow = 1
	cfg.ContentFlex = tview.NewFlex().SetDirection(tview.FlexRow).
		AddItem(welcomeFlex, 0, 1, false).
		AddItem(form, 0, 0, false).
		AddItem(tabsFlex, 0, 0, false).
		AddItem(submitUi, 0, 0, false)

	// 创建一个列表视图
	listData := getList()
	list := tview.NewList()
	for i := 0; i < len(listData); i++ {
		title := tview.WordWrap(listData[i].Title, 20)
		titleStr := title[0]
		if len(title[0]) > 20 || len(title[0]) == 20 {
			titleStr = titleStr + "..."
		}
		list.AddItem(titleStr, "", rune(i+1), cfg.clickList(form, listData[i], welcomeFlex, tabsFlex))
	}

	/* bodyFlex := tview.NewFlex().SetDirection(tview.FlexColumn).
	AddItem(list, 0, 50, false).
	AddItem(contentFlex, 0, 100, false) */

	/* // 将文本框和按钮放入一个灵活的布局中
	flex := tview.NewFlex().SetDirection(tview.FlexRow).
		// AddItem(headerFlex, 0, 1, false).
		AddItem(bodyFlex, 0, 1, false) */

	addform := tview.NewForm().
		AddTextView("", "添加数据", 40, 2, true, false).
		AddInputField("name", "", 20, nil, nil).
		AddInputField("appid", "", 20, nil, nil).
		AddInputField("mobile", "", 20, nil, nil).
		AddInputField("交付中心id", "", 20, nil, nil).
		AddButton("重置", func() {
			app.Stop()
		}).
		AddButton("保存", nil)

	grid := tview.NewGrid().
		SetRows(2, 0, 2).
		SetColumns(30, 0, 31).
		SetBorders(true).
		AddItem(newPrimitive("微信版本管理工具"), 0, 0, 1, 3, 0, 0, false)

	grid.AddItem(list, 1, 0, 1, 1, 0, 100, false).
		AddItem(cfg.ContentFlex, 1, 1, 1, 1, 0, 100, false).
		AddItem(addform, 1, 2, 1, 1, 0, 100, false)

	// 将布局设置为应用程序的根视图
	app.SetRoot(grid, true).EnableMouse(true)

	// 运行应用程序
	if err := app.Run(); err != nil {
		panic(err)
	}
}

func (app *Config) clickList(form *tview.Form, item Company, welcomeFlex *tview.Flex, tabsFlex *tview.Flex) func() {
	return func() {
		form.GetFormItem(0).(*tview.TextView).SetText(item.Title)
		form.GetFormItem(1).(*tview.TextView).SetText(item.AppID)

		// 通过调整按钮的大小来达到隐藏的效果
		app.ContentFlex.ResizeItem(welcomeFlex, 0, 0)
		app.ContentFlex.ResizeItem(form, 0, 1)
		app.ContentFlex.ResizeItem(tabsFlex, 0, 1)

	}
}

// 保存日志
func SaveLog(info string) {
	// 获取当前工作目录
	currentDir, errs := os.Getwd()
	if errs != nil {
		log.Fatal(errs)
	}
	filePath := currentDir + "/log.txt"

	// 检查文件是否存在
	_, err := os.Stat(filePath)
	if os.IsNotExist(err) {
		// 文件不存在，创建并写入内容
		err = ioutil.WriteFile(filePath, []byte(info), 0644)
		if err != nil {
			fmt.Println("创建文件失败：", err)
			return
		}
		fmt.Println("文件已成功创建并写入")
	} else {
		// 文件存在，追加内容
		// 打开文件
		file, err := os.OpenFile(filePath, os.O_APPEND|os.O_WRONLY, 0644)
		if err != nil {
			log.Fatal(err)
		}
		defer file.Close()

		// 将内容追加到文件末尾
		_, err = file.Write([]byte(info))
		if err != nil {
			log.Fatal(err)
		}
	}
}
